int blend_program_id;
int blit_program_id;
- guint vao_id;
-
GArray *opaque_render_items;
GArray *transparent_render_items;
gboolean has_buffers : 1;
- gboolean has_stencil_buffer : 1;
- gboolean has_depth_buffer : 1;
};
struct _GskGLRendererClass
}
static void
-gsk_gl_renderer_create_buffers (GskGLRenderer *self)
+gsk_gl_renderer_create_buffers (GskGLRenderer *self,
+ int width,
+ int height)
{
if (self->has_buffers)
return;
glGenFramebuffersEXT (1, &self->frame_buffer);
if (self->texture_id == 0)
- glGenTextures (1, &self->texture_id);
-
- if (self->has_depth_buffer || self->has_stencil_buffer)
- {
- if (self->depth_stencil_buffer == 0)
- glGenRenderbuffersEXT (1, &self->depth_stencil_buffer);
- }
- else
{
- if (self->depth_stencil_buffer != 0)
- {
- glDeleteRenderbuffersEXT (1, &self->depth_stencil_buffer);
- self->depth_stencil_buffer = 0;
- }
- }
-
- /* We only have one VAO at the moment */
- glGenVertexArrays (1, &self->vao_id);
- glBindVertexArray (self->vao_id);
-
- self->has_buffers = TRUE;
-}
+ glGenTextures (1, &self->texture_id);
-static void
-gsk_gl_renderer_allocate_buffers (GskGLRenderer *self,
- int width,
- int height)
-{
- if (self->context == NULL)
- return;
-
- if (self->texture_id != 0)
- {
glBindTexture (GL_TEXTURE_2D, self->texture_id);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
}
- if (self->has_depth_buffer || self->has_stencil_buffer)
- {
- glBindRenderbuffer (GL_RENDERBUFFER, self->depth_stencil_buffer);
+ if (self->depth_stencil_buffer == 0)
+ glGenRenderbuffersEXT (1, &self->depth_stencil_buffer);
- if (self->has_stencil_buffer)
- glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
- else
- glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
- }
+ glBindRenderbuffer (GL_RENDERBUFFER, self->depth_stencil_buffer);
+ glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
+
+ self->has_buffers = TRUE;
}
static void
gsk_gl_renderer_attach_buffers (GskGLRenderer *self)
{
- gsk_gl_renderer_create_buffers (self);
-
GSK_NOTE (OPENGL, g_print ("Attaching buffers\n"));
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, self->frame_buffer);
GL_TEXTURE_2D, self->texture_id, 0);
}
- if (self->depth_stencil_buffer != 0)
- {
- if (self->has_depth_buffer)
- glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, self->depth_stencil_buffer);
+ glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, self->depth_stencil_buffer);
- if (self->has_stencil_buffer)
- glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, self->depth_stencil_buffer);
- }
+ glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, self->depth_stencil_buffer);
}
static void
gdk_gl_context_make_current (self->context);
- if (self->vao_id != 0)
- {
- glDeleteVertexArrays (1, &self->vao_id);
- self->vao_id = 0;
- }
-
if (self->depth_stencil_buffer != 0)
{
glDeleteRenderbuffersEXT (1, &self->depth_stencil_buffer);
if (!gsk_gl_renderer_create_programs (self))
return FALSE;
- gsk_gl_renderer_create_buffers (self);
-
return TRUE;
}
static void
gsk_gl_renderer_clear (GskGLRenderer *self)
{
- int clear_bits = GL_COLOR_BUFFER_BIT;
-
- if (self->has_depth_buffer)
- clear_bits |= GL_DEPTH_BUFFER_BIT;
- if (self->has_stencil_buffer)
- clear_bits |= GL_STENCIL_BUFFER_BIT;
-
GSK_NOTE (OPENGL, g_print ("Clearing viewport\n"));
glClearColor (0, 0, 0, 0);
- glClear (clear_bits);
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
static void
gsk_renderer_get_viewport (renderer, &viewport);
- gsk_gl_renderer_create_buffers (self);
- gsk_gl_renderer_allocate_buffers (self, viewport.size.width, viewport.size.height);
+ gsk_gl_renderer_create_buffers (self, viewport.size.width, viewport.size.height);
gsk_gl_renderer_attach_buffers (self);
gsk_renderer_get_modelview (renderer, &modelview);
gsk_gl_renderer_clear (self);
glDisable (GL_BLEND);
- if (self->has_depth_buffer)
- {
- glEnable (GL_DEPTH_TEST);
- glDepthFunc (GL_LESS);
- }
- else
- glDisable (GL_DEPTH_TEST);
+
+ glEnable (GL_DEPTH_TEST);
+ glDepthFunc (GL_LESS);
/* Opaque pass: front-to-back */
GSK_NOTE (OPENGL, g_print ("Rendering %u opaque items\n", self->opaque_render_items->len));
render_item (self, item);
}
- if (self->has_depth_buffer)
- {
- glEnable (GL_DEPTH_TEST);
- glDepthFunc (GL_LEQUAL);
- }
+ glEnable (GL_DEPTH_TEST);
+ glDepthFunc (GL_LEQUAL);
glEnable (GL_BLEND);
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
gdk_gl_context_make_current (self->context);
gsk_gl_renderer_clear_tree (self);
+ gsk_gl_renderer_destroy_buffers (self);
}
static void
gsk_ensure_resources ();
graphene_matrix_init_identity (&self->mvp);
-
- self->has_depth_buffer = TRUE;
- self->has_stencil_buffer = TRUE;
}